﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Dir
{
    /* Именнованые параметры-значения: out, lang, dir
       Именнованые параметры-флаги:    cgi

       formatter -out d:\test\out -lang cs -dir d:\test\in
         namedParams   = { out => d:\test\out, lang => cs, dir => d:\test\in }
         orderedParams = { }
       formatter -cgi -ghjhbjhb d:\test\in\Program.cs
         namedParams   = { cgi => , }
         orderedParams = { d:\test\in\Program.cs }      
   */

    public class CmdParams
    {
        private List<string> namedParamsValues = new List<string>(), //лист именованных параметров
                             namedParamsFlags = new List<string>(); //лист флагов (применяем или не применяем что-то)

        private Dictionary<string, string> namedParams = new Dictionary<string, string>(); // словарь для определения значения именнованных параметров
        private List<string> orderedParams = new List<string>(); //лист в который записывают lheubt yt ye;ysq dcnhtxf.obtcz gfhfvtnhs 

        private void Parse(string[] args)
        {
            namedParams.Clear();
            orderedParams.Clear();
            int i = 0;
            while (i < args.Length)
            {
                string arg = args[i];
                if (arg.Length > 0 && arg[0] == '-')
                {
                    arg = arg.Substring(1); //Извлекает подстроку из данного экземпляра. Подстрока начинается с указанной позиции знака.
                    if (namedParamsValues.Contains(arg)) // если наша строка содержится (Constaint) в списке именнованых параметров
                    {
                        if (i < args.Length - 1 &&
                            (args[i + 1].Length == 0 || args[i + 1][0] != '-'))
                        {
                            //Console.WriteLine("ghkljl, {0}", args[i+1][0]);
                            namedParams[arg] = args[i + 1];
                            i++;
                        }
                        else
                            namedParams[arg] = null;
                    }
                    else if (namedParamsFlags.Contains(arg))
                        namedParams[arg] = null;
                }
                else
                    orderedParams.Add(arg);
                i++;
            }
        }

        public CmdParams(string[] namedParamsValues, string[] namedParamsFlags, string[] args)
        {
            foreach (string name in namedParamsValues)
                this.namedParamsValues.Add(name);
            foreach (string name in namedParamsFlags)
                this.namedParamsFlags.Add(name);
            Parse(args);
        }

        public int NamedParamsCount
        {
            get
            {
                return namedParams.Count;
            }
        }
        //Определяет, содержится ли указанный ключ в namedParams
        public bool IsExistsNamedParam(string name) 
        {
            return namedParams.ContainsKey(name);
        }
        //Возвращает значение по ключу
        public string GetNamedParam(string name)
        {
            return IsExistsNamedParam(name) ? namedParams[name]: null;
        }

        public int OrderedParamsCount
        {
            get
            {
                return orderedParams.Count;
            }
        }

        public string GetOrderedParam(int index)
        {
            return index < OrderedParamsCount ? orderedParams[index] : null;
        }

        public string this[string name]
        {
            get
            {
                return GetNamedParam(name);
            }
        }

        public string this[int index]
        {
            get
            {
                return GetOrderedParam(index);
            }
        }
    }
}
